/**
 * Base64 编码解码工具
 */

/**
 * 将字符串编码为 Base64
 * @param {string} str - 要编码的字符串
 * @returns {string} Base64 编码后的字符串
 */
export function encodeBase64(str) {
  try {
    // 在浏览器环境中使用 btoa
    if (typeof btoa !== 'undefined') {
      return btoa(unescape(encodeURIComponent(str)))
    }
    
    // 在 Node.js 环境中使用 Buffer
    if (typeof Buffer !== 'undefined') {
      return Buffer.from(str, 'utf8').toString('base64')
    }
    
    throw new Error('Base64 encoding not supported')
  } catch (error) {
    console.log('Base64 编码错误:', error)
    return str
  }
}

/**
 * 将 Base64 字符串解码
 * @param {string} base64Str - Base64 编码的字符串
 * @returns {string} 解码后的字符串
 */
export function decodeBase64(base64Str) {
  try {
    // 在浏览器环境中使用 atob
    if (typeof atob !== 'undefined') {
      return decodeURIComponent(escape(atob(base64Str)))
    }
    
    // 在 Node.js 环境中使用 Buffer
    if (typeof Buffer !== 'undefined') {
      return Buffer.from(base64Str, 'base64').toString('utf8')
    }
    
    throw new Error('Base64 decoding not supported')
  } catch (error) {
    console.log('Base64 解码错误:', error)
    return base64Str
  }
}

/**
 * 检查字符串是否为有效的 Base64 格式
 * @param {string} str - 要检查的字符串
 * @returns {boolean} 是否为有效的 Base64 格式
 */
export function isValidBase64(str) {
  try {
    const base64Pattern = /^[A-Za-z0-9+/]*={0,2}$/
    return base64Pattern.test(str) && str.length % 4 === 0
  } catch (error) {
    return false
  }
}

/**
 * 对象转 Base64 编码的 JSON 字符串
 * @param {Object} obj - 要编码的对象
 * @returns {string} Base64 编码的 JSON 字符串
 */
export function objectToBase64(obj) {
  try {
    const jsonStr = JSON.stringify(obj)
    return encodeBase64(jsonStr)
  } catch (error) {
    console.log('对象转 Base64 编码错误:', error)
    return ''
  }
}

/**
 * Base64 编码的 JSON 字符串转对象
 * @param {string} base64Str - Base64 编码的 JSON 字符串
 * @returns {Object} 解码后的对象
 */
export function base64ToObject(base64Str) {
  try {
    const jsonStr = decodeBase64(base64Str)
    return JSON.parse(jsonStr)
  } catch (error) {
    console.log('Base64 转对象错误:', error)
    return {}
  }
}

// 为了兼容性，也导出单个函数
export const Base64 = {
  encode: encodeBase64,
  decode: decodeBase64,
  isValid: isValidBase64,
  objectToBase64,
  base64ToObject
}

export default Base64
